#!/bin/bash
# ============================================================
# BONO SAYIM — KURULUM (macOS)
#
# Kullanıcı bu uygulamaya çift tıklar. Terminal AÇILMAZ; her adım
# normal bir pencerede sorulur ve gösterilir (osascript = macOS'un
# kendi diyalogları, ek program gerekmez).
#
# NE YAPAR
#   1. Node.js var mı bakar, yoksa indirme sayfasını açar
#   2. Servis dosyalarını siteden indirir  (~/BonoSayim)
#   3. E-posta/şifreyi sorar, ayar dosyalarını YAZAR (600 izniyle)
#   4. Bağımlılıkları kurar (npm install)
#   5. Yazdırma ve mesaj servislerini otomatik başlatmaya alır
#   6. Gerçekten ayağa kalktı mı diye bakar, sonucu pencerede söyler
#
# NEDEN ~/BonoSayim: macOS, arka planda çalışan servislerin
# Masaüstü/Belgeler/İndirilenler klasörlerine erişimini izne bağlıyor.
# Ana kullanıcı klasöründe böyle bir engel yok — kurulumun en sık
# takıldığı yer buydu, kökten çözülüyor.
# ============================================================

export LC_ALL=C
# Adres değiştirilebilir olsun: yayına almadan önce yerel bir kopyayla
# denemek için  BONO_SITE=http://localhost:8000  yeter.
SITE="${BONO_SITE:-https://bono-sayim.vercel.app}"
PAKET="$SITE/indir/bono-servis.zip"
HEDEF="$HOME/BonoSayim"
LOGDIR="$HOME/Library/Logs"
mkdir -p "$LOGDIR"
KURULUM_LOG="$LOGDIR/bono-kurulum.log"
: > "$KURULUM_LOG"

kaydet() { echo "$(date '+%H:%M:%S') $*" >> "$KURULUM_LOG"; }

# --- Pencereler -------------------------------------------------------------
# osascript'e metni argüman olarak veriyoruz: metnin içinde tırnak ya da
# ters bölü olsa bile AppleScript kaynağı bozulmasın (kullanıcı e-postası
# buradan geçiyor).
mesaj() {   # $1 başlık, $2 metin
  osascript - "$1" "$2" <<'OSA' >/dev/null 2>&1
on run argv
  display dialog (item 2 of argv) with title (item 1 of argv) buttons {"Tamam"} default button 1 with icon note
end run
OSA
}

hata() {    # $1 metin — gösterir ve kurulumu bitirir
  osascript - "$1" <<'OSA' >/dev/null 2>&1
on run argv
  display dialog (item 1 of argv) with title "BONO Kurulum — durdu" buttons {"Kapat"} default button 1 with icon stop
end run
OSA
  kaydet "DURDU: $1"
  exit 1
}

sor() {     # $1 soru, $2 varsayılan → cevabı yazdırır ('' = iptal)
  osascript - "$1" "$2" <<'OSA' 2>/dev/null
on run argv
  try
    set c to display dialog (item 1 of argv) with title "BONO Kurulum" default answer (item 2 of argv) buttons {"Vazgeç", "Devam"} default button 2
    return text returned of c
  on error
    return ""
  end try
end run
OSA
}

sorGizli() {  # şifre — yazarken noktalarla görünür
  osascript - "$1" <<'OSA' 2>/dev/null
on run argv
  try
    set c to display dialog (item 1 of argv) with title "BONO Kurulum" default answer "" with hidden answer buttons {"Vazgeç", "Devam"} default button 2
    return text returned of c
  on error
    return ""
  end try
end run
OSA
}

onay() {    # $1 metin → "evet" ya da ""
  osascript - "$1" <<'OSA' 2>/dev/null
on run argv
  try
    display dialog (item 1 of argv) with title "BONO Kurulum" buttons {"Vazgeç", "Devam"} default button 2
    return "evet"
  on error
    return ""
  end try
end run
OSA
}

# Uzun adımlarda ekranda "takıldı mı?" hissi olmasın diye bildirim.
bildir() { osascript -e "display notification \"$1\" with title \"BONO Kurulum\"" >/dev/null 2>&1; }

# --- 0) Hoş geldin ----------------------------------------------------------
[ -z "$(onay "BONO yazdırma ve mesaj servisleri bu bilgisayara kurulacak.

Kurulumdan sonra:
 · Çıkış yapınca fiş ve adres etiketi kendiliğinden basılır
 · Otomatik mesajlar bilgisayar açıkken kendiliğinden gider

Sisteme girerken kullandığın e-posta ve şifre sorulacak.
Yaklaşık 2 dakika sürer.")" ] && exit 0

# --- 1) Node.js -------------------------------------------------------------
NODE="$(command -v node || true)"
for c in /opt/homebrew/bin/node /usr/local/bin/node; do
  [ -z "$NODE" ] && [ -x "$c" ] && NODE="$c"
done
if [ -z "$NODE" ]; then
  if [ -n "$(onay "Bilgisayarda Node.js yok — servisler onsuz çalışmıyor.

\"Devam\"a basınca indirme sayfası açılır.
LTS yazan sürümü kur, sonra bu kurulumu tekrar başlat.")" ]; then
    open "https://nodejs.org/tr/download"
  fi
  exit 0
fi
NPM="$(dirname "$NODE")/npm"
[ -x "$NPM" ] || NPM="$(command -v npm || echo npm)"
# npm bir kabuk betiği ve ilk satırı `#!/usr/bin/env node`. Finder'dan açılan
# uygulamanın PATH'i dar olduğu için `env` node'u bulamıyor ve npm
# "env: node: No such file or directory" ile ölüyor. Node'un klasörünü
# PATH'in başına koymak yeterli.
PATH="$(dirname "$NODE"):$PATH"
export PATH
kaydet "node: $NODE"

# --- 2) Giriş bilgileri -----------------------------------------------------
EPOSTA="$(sor "Sisteme girerken kullandığın e-posta:" "")"
[ -z "$EPOSTA" ] && exit 0
case "$EPOSTA" in *@*.*) ;; *) hata "\"$EPOSTA\" bir e-posta adresine benzemiyor. Kurulumu tekrar başlat." ;; esac

SIFRE="$(sorGizli "$EPOSTA hesabının şifresi:")"
[ -z "$SIFRE" ] && exit 0

# --- 3) Servis dosyalarını indir -------------------------------------------
bildir "Servis dosyaları indiriliyor…"
ZIP="$(mktemp "${TMPDIR:-/tmp}/bono-servis.XXXXXX.zip")"
if ! curl -fsSL --max-time 120 -o "$ZIP" "$PAKET" 2>>"$KURULUM_LOG"; then
  rm -f "$ZIP"
  hata "Servis dosyaları indirilemedi.

İnternet bağlantını kontrol et ve kurulumu tekrar başlat.
Adres: $PAKET"
fi

# Eski kurulum varsa AYAR DOSYALARI KORUNUR: kullanıcı şifresini ve
# yazıcı seçimini ikinci kurulumda kaybetmesin.
GECICI="$(mktemp -d "${TMPDIR:-/tmp}/bono-cikar.XXXXXX")"
if ! unzip -qq -o "$ZIP" -d "$GECICI" 2>>"$KURULUM_LOG"; then
  rm -rf "$ZIP" "$GECICI"
  hata "İndirilen dosya açılamadı. Kurulumu tekrar başlat."
fi
rm -f "$ZIP"

mkdir -p "$HEDEF"
# -R ile üzerine kopyala; .env dosyaları pakette olmadığı için silinmez.
cp -R "$GECICI"/. "$HEDEF"/ 2>>"$KURULUM_LOG"
rm -rf "$GECICI"
[ -d "$HEDEF/print-worker" ] || hata "Servis dosyaları eksik indi. Kurulumu tekrar başlat."
kaydet "paket açıldı: $HEDEF"

# --- 4) Ayar dosyaları ------------------------------------------------------
# Şifre bir an bile herkese okunabilir bir dosyada durmasın: önce boş dosya
# 600 izniyle açılıyor, sonra içi yazılıyor.
envYaz() {  # $1 klasör, $2 ek satırlar
  local d="$HEDEF/$1"
  mkdir -p "$d"
  : > "$d/.env"
  chmod 600 "$d/.env"
  {
    echo "# BONO — bu dosya YALNIZCA bu bilgisayarda durur."
    echo "# BONO Kurulum tarafından oluşturuldu: $(date '+%d.%m.%Y %H:%M')"
    echo ""
    echo "BONO_EPOSTA=$EPOSTA"
    echo "BONO_SIFRE=$SIFRE"
    [ -n "$2" ] && echo "$2"
  } > "$d/.env"
}
envYaz print-worker "POLL_MS=4000"
envYaz wa-worker ""
unset SIFRE
kaydet "ayar dosyaları yazıldı"

# --- 5) Bağımlılıklar -------------------------------------------------------
bildir "Gerekli parçalar kuruluyor (1-2 dakika)…"
for k in print-worker wa-worker; do
  if [ ! -d "$HEDEF/$k/node_modules" ]; then
    ( cd "$HEDEF/$k" && "$NPM" install --no-audit --no-fund ) >>"$KURULUM_LOG" 2>&1 \
      || hata "Gerekli parçalar kurulamadı ($k).

Ayrıntı: $KURULUM_LOG"
  fi
done
kaydet "npm install bitti"

# --- 6) Otomatik başlatma ---------------------------------------------------
# Servis, bilgisayar her açıldığında kendiliğinden çalışsın; kapanırsa
# kendini yeniden başlatsın (KeepAlive).
mkdir -p "$HOME/Library/LaunchAgents"
kur() {   # $1 etiket, $2 klasör, $3 kayıt adı
  local plist="$HOME/Library/LaunchAgents/$1.plist"
  cat > "$plist" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>$1</string>
  <key>ProgramArguments</key>
  <array>
    <string>$NODE</string>
    <string>$HEDEF/$2/index.js</string>
  </array>
  <key>WorkingDirectory</key><string>$HEDEF/$2</string>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>ThrottleInterval</key><integer>30</integer>
  <key>StandardOutPath</key><string>$LOGDIR/$3.log</string>
  <key>StandardErrorPath</key><string>$LOGDIR/$3-hata.log</string>
</dict>
</plist>
EOF
  : > "$LOGDIR/$3.log"
  launchctl bootout "gui/$UID/$1" 2>/dev/null || launchctl unload "$plist" 2>/dev/null || true
  launchctl bootstrap "gui/$UID" "$plist" 2>/dev/null || launchctl load "$plist" 2>/dev/null
}
kur com.bono.print-worker print-worker bono-yazdirma
kur com.bono.wa-worker wa-worker bono-mesaj

# --- 7) Gerçekten çalışıyor mu? --------------------------------------------
bildir "Servisler başlatılıyor…"
bekle() {   # $1 kayıt dosyası → 0 = başladı
  for i in $(seq 1 20); do
    sleep 1
    grep -q "Kuyruk izleniyor" "$LOGDIR/$1.log" 2>/dev/null && return 0
  done
  return 1
}
YAZDIRMA_OK=1; MESAJ_OK=1
bekle bono-yazdirma || YAZDIRMA_OK=0
bekle bono-mesaj    || MESAJ_OK=0

# Giriş hatası en sık görülen sebep — onu ayrıca tanı.
if grep -qi "Giriş yapılamadı" "$LOGDIR/bono-yazdirma.log" "$LOGDIR/bono-mesaj.log" 2>/dev/null; then
  hata "E-posta ya da şifre kabul edilmedi.

Web'e girerken kullandığın bilgilerin aynısı olmalı.
Kurulumu tekrar başlatıp yeniden dene."
fi

if [ "$YAZDIRMA_OK" = "1" ] && [ "$MESAJ_OK" = "1" ]; then
  mesaj "BONO Kurulum — bitti" "Kurulum tamam. İki servis de çalışıyor ve bilgisayar her açıldığında kendiliğinden başlayacak.

SIRADA NE VAR
 1) Web'de sağ üstteki Yazdırma düğmesi → Yazıcı seçimi:
    fiş ve etiket yazıcını listeden seç.
 2) Ayarlar > Otomatik Mesajlar > Mesaj Kurulumu:
    NetGSM bilgilerini gir.

Kurulum klasörü: $HEDEF"
  exit 0
fi

mesaj "BONO Kurulum — yarım kaldı" "Dosyalar kuruldu ama $( [ "$YAZDIRMA_OK" = "0" ] && printf 'yazdırma servisi '; [ "$MESAJ_OK" = "0" ] && printf 'mesaj servisi ')başlamadı.

En sık sebep: macOS arka plan servisine izin vermemiş oluyor.
Sistem Ayarları > Genel > Giriş Öğeleri'nde BONO servislerinin
açık olduğundan emin ol ve kurulumu tekrar başlat.

Ayrıntı: $KURULUM_LOG"
exit 1
